package aliyun.cx.admin.util;

import aliyun.cx.service.service.SysConfigService;
import org.springframework.stereotype.Component;

/**
 * 配置工具类
 * 用于在系统中获取和应用配置
 */
@Component
public class ConfigUtil {

    private final SysConfigService sysConfigService;
    
    public ConfigUtil(SysConfigService sysConfigService) {
        this.sysConfigService = sysConfigService;
    }

    /**
     * 获取配置值
     * @param configKey 配置键
     * @return 配置值
     */
    public String getConfigValue(String configKey) {
        return sysConfigService.getConfigValue(configKey);
    }

    /**
     * 获取配置值，如果不存在则返回默认值
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    public String getConfigValue(String configKey, String defaultValue) {
        return sysConfigService.getConfigValue(configKey, defaultValue);
    }

    /**
     * 获取布尔类型配置值
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 布尔值
     */
    public boolean getBooleanConfig(String configKey, boolean defaultValue) {
        String value = getConfigValue(configKey);
        if (value == null) {
            return defaultValue;
        }
        return Boolean.parseBoolean(value);
    }

    /**
     * 获取数字类型配置值
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 数字值
     */
    public int getIntConfig(String configKey, int defaultValue) {
        String value = getConfigValue(configKey);
        if (value == null) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /**
     * 获取长整型配置值
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 长整型值
     */
    public long getLongConfig(String configKey, long defaultValue) {
        String value = getConfigValue(configKey);
        if (value == null) {
            return defaultValue;
        }
        try {
            return Long.parseLong(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /**
     * 检查文件上传是否启用
     * @return 是否启用文件上传
     */
    public boolean isFileUploadEnabled() {
        return getBooleanConfig("upload.enabled", true);
    }

    /**
     * 获取最大文件上传大小（字节）
     * @return 最大文件大小
     */
    public long getMaxFileSize() {
        return getLongConfig("upload.maxFileSize", 5 * 1024 * 1024); // 默认5MB
    }

    /**
     * 获取允许上传的文件类型
     * @return 文件类型列表（逗号分隔）
     */
    public String getAllowedFileTypes() {
        return getConfigValue("upload.allowedTypes", "jpg,jpeg,png,gif,webp");
    }

    /**
     * 检查是否允许上传指定类型的文件
     * @param fileName 文件名
     * @return 是否允许
     */
    public boolean isAllowedFileType(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return false;
        }
        
        String extension = "";
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0) {
            extension = fileName.substring(lastDotIndex + 1).toLowerCase();
        }
        
        String allowedTypes = getAllowedFileTypes();
        String[] types = allowedTypes.split(",");
        
        for (String type : types) {
            if (type.trim().equalsIgnoreCase(extension)) {
                return true;
            }
        }
        
        return false;
    }

    /**
     * 检查系统监控是否启用
     * @return 是否启用系统监控
     */
    public boolean isSystemMonitorEnabled() {
        return getBooleanConfig("monitor.enabled", true);
    }

    /**
     * 获取系统监控间隔（秒）
     * @return 监控间隔
     */
    public int getMonitorInterval() {
        return getIntConfig("monitor.interval", 300); // 默认5分钟
    }

    /**
     * 检查自动备份是否启用
     * @return 是否启用自动备份
     */
    public boolean isAutoBackupEnabled() {
        return getBooleanConfig("backup.autoBackup", true);
    }

    /**
     * 获取备份保留天数
     * @return 保留天数
     */
    public int getBackupRetentionDays() {
        return getIntConfig("backup.retentionDays", 30);
    }

    /**
     * 检查缓存是否启用
     * @return 是否启用缓存
     */
    public boolean isCacheEnabled() {
        return getBooleanConfig("cache.enabled", true);
    }

    /**
     * 获取缓存过期时间（秒）
     * @return 缓存过期时间
     */
    public int getCacheTTL() {
        return getIntConfig("cache.ttl", 3600); // 默认1小时
    }

    /**
     * 获取日志保留天数
     * @return 日志保留天数
     */
    public int getLogRetentionDays() {
        return getIntConfig("log.retentionDays", 90);
    }

    /**
     * 获取会话超时时间（秒）
     * @return 会话超时时间
     */
    public int getSessionTimeout() {
        return getIntConfig("system.sessionTimeout", 7200); // 默认2小时
    }

    /**
     * 获取默认分页大小
     * @return 默认分页大小
     */
    public int getDefaultPageSize() {
        return getIntConfig("system.pageSize", 10);
    }

    /**
     * 获取备份时间
     * @return 备份时间（格式：HH:mm）
     */
    public String getBackupTime() {
        return getConfigValue("backup.backupTime", "02:00");
    }

    /**
     * 检查邮件功能是否启用
     * @return 是否启用邮件功能
     */
    public boolean isEmailEnabled() {
        String smtpHost = getConfigValue("email.smtp.host");
        String smtpUsername = getConfigValue("email.smtp.username");
        String smtpPassword = getConfigValue("email.smtp.password");
        return smtpHost != null && !smtpHost.isEmpty() 
            && smtpUsername != null && !smtpUsername.isEmpty()
            && smtpPassword != null && !smtpPassword.isEmpty();
    }

    /**
     * 获取SMTP服务器地址
     * @return SMTP服务器地址
     */
    public String getSmtpHost() {
        return getConfigValue("email.smtp.host", "");
    }

    /**
     * 获取SMTP服务器端口
     * @return SMTP服务器端口
     */
    public int getSmtpPort() {
        return getIntConfig("email.smtp.port", 587);
    }

    /**
     * 检查SMTP是否启用SSL
     * @return 是否启用SSL
     */
    public boolean isSmtpSslEnabled() {
        return getBooleanConfig("email.smtp.ssl", true);
    }
    
    /**
     * 检查文章发布功能是否启用
     */
    public boolean isArticlePublishEnabled() {
        return getBooleanConfig("article.publish.enabled", true);
    }
    
    /**
     * 检查评论发布功能是否启用
     */
    public boolean isCommentPublishEnabled() {
        return getBooleanConfig("comment.publish.enabled", true);
    }
    
    /**
     * 检查用户注册功能是否启用
     */
    public boolean isUserRegisterEnabled() {
        return getBooleanConfig("user.register.enabled", true);
    }
    
    /**
     * 检查分类创建功能是否启用
     */
    public boolean isCategoryCreateEnabled() {
        return getBooleanConfig("category.create.enabled", true);
    }
    
    /**
     * 检查标签创建功能是否启用
     */
    public boolean isTagCreateEnabled() {
        return getBooleanConfig("tag.create.enabled", true);
    }
}
